package com.cskaoyan.javase.oop2._2polymorphic._0introduction;

/**
 * 多态
 * 从字面意义上理解，同一个事物，在不同的时刻/情况表现出不同的状态，就可以称之为多态。
 *
 * 在Java的多态当中，多态指的是：
 * 同一种事物：同一个引用（即父类的引用）
 * 不同的情况：指向不同的对象（不同的子类对象）
 * 不同的状态：调用同名方法会体现出不同的行为
 *  总结来说，
 *  Java中的多态指的是，同一个父类引用指向不同子类对象时，调用同名成员方法
 *  根据指向实际对象的不同，得到的行为也会随之不不同。
 *
 *  多态的本质就是继承中的方法重写。
 *  于是总结多态发生的场景：
 *  1.肯定需要继承
 *  2.需要存在方法重写
 *  3.父类引用指向不同子类对象
 *
 *  不能发生多态的场景：
 *  1.不能继承的类。被final修饰的类
 *  2.不能重写的方法。
 *      a.private方法
 *      b.静态方法
 *      c.构造器
 *      d.final修饰的方法
 *
 *
 * @since 14:24
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 同一个父类引用
        Phone p;
        // 指向不同的子类对象
        p = new IPhone();
        p.call();
        p = new MiPhone();
        p.call();
        p = new SamsungPhone();
        p.call();
    }
}

class Phone {
    void call() {
        System.out.println("打电话！");
    }
}

class IPhone extends Phone {
    @Override
    void call() {
        System.out.println("嘿Siri，打电话给小爱同学！");
    }
}

class MiPhone extends Phone {
    @Override
    void call() {
        System.out.println("小爱同学，打电话给siri！");
    }
}

class SamsungPhone extends Phone {
    @Override
    void call() {
        System.out.println("直接爆炸了！");
    }
}
